/**
 * @brief 三维场景雪
 */
class SceneSnow {
  constructor(viewer) {
    this.viewer = viewer;
    this.snow = null;
  }
  addSnow() {
    this.snow = new Cesium.PostProcessStage({
      name: "czm_snow",
      uniforms: { speed: 10, snowScale: 1 },
      fragmentShader:
        "uniform sampler2D colorTexture;\n" +
        "in vec2 v_textureCoordinates;\n" +
        "uniform float speed;\n" +
        "uniform float snowScale;\n" +
        "float snow(vec2 uv,float scale)\n" +
        "{\n" +
        "    float time = czm_frameNumber * speed / 1000.0 ;\n" +
        "    float w=smoothstep(1.,0.,-uv.y*(scale/10.));if(w<.1)return 0.;\n" +
        "    uv+=time/scale;uv.y+=time*2./scale;uv.x+=sin(uv.y+time*.5)/scale;\n" +
        "    uv*=scale;vec2 s=floor(uv),f=fract(uv),p;float k=3.,d;\n" +
        "    p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;d=length(p);k=min(d,k);\n" +
        "    k=smoothstep(0.,k,sin(f.x+f.y)*0.01);\n" +
        "    return k*w;\n" +
        "}\n" +
        "void main(void){\n" +
        "     vec2 resolution = czm_viewport.zw;\n" +
        "     vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n" +
        "     vec3 finalColor=vec3(0);\n" +
        "     float c = 0.0;\n" +
        "     c+=snow(uv,30.)*.0;\n" +
        "     c+=snow(uv,20.)*.0;\n" +
        "     c+=snow(uv,15.)*.0;\n" +
        "     c+=snow(uv,10. /snowScale);\n" +
        "     c+=snow(uv,8. /snowScale);\n" +
        "     c+=snow(uv,6. /snowScale);\n" +
        "     c+=snow(uv,5. /snowScale);\n" +
        "     finalColor=(vec3(c));\n" +
        "     out_FragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(finalColor,1), 0.5);\n" +
        "}",
    });
    this.viewer.scene.postProcessStages.add(this.snow);
  }
  //改变雪花大小和降落的速度
  changeSnow(e) {
    const { l, v } = e;
    this.snow.uniforms.speed = v;
  }
  removeSnow() {
    if (this.snow) this.viewer.scene.postProcessStages.remove(this.snow);
  }
}
export default SceneSnow;
